/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cl.orientesalud.dao.impl;

import cl.orientesalud.dao.Dao;
import cl.orientesalud.dao.MedicoDao;
import cl.orientesalud.dao.PacienteDao;
import cl.orientesalud.dao.TipoTratamientoDao;
import cl.orientesalud.dao.TratamientoDao;
import cl.orientesalud.dominio.Descuento;
import cl.orientesalud.dominio.Medico;
import cl.orientesalud.dominio.Paciente;
import cl.orientesalud.dominio.TipoTratamiento;
import cl.orientesalud.dominio.Tratamiento;
import cl.orientesalud.util.OrienteLog;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;

/**
 *
 * @author nicolas
 */
public class TratamientoDaoImpl extends Dao implements TratamientoDao{
    Logger logger=OrienteLog.obtenerLogger(PacienteDaoImpl.class);
    @Override
    public void insertarTratamiento(Tratamiento tratamiento) throws Exception {
        logger.debug("Insertando tratamiento:"+tratamiento);
        PreparedStatement pstmt=null;
        String insert="INSERT INTO tratamiento(pac_rut,"
                + "med_rut,"
                + "tt_id,"
                + "trat_valor,"
                + "trat_fec_ini,"
                + "trat_fec_fin,"
                + "trat_otro_dcto) "
                              + "VALUES(?,?,?,?,?,?,?)";
        try {
            pstmt = conexion.preparedStatement(insert);
            pstmt.setString(1, tratamiento.getPaciente().getRut());
            pstmt.setString(2, tratamiento.getMedico().getRut());
            pstmt.setInt(3, tratamiento.getTipo().getId());
            pstmt.setLong(4, tratamiento.getValorRepartir());
            pstmt.setDate(5, new Date(tratamiento.getFechaInicio().getTime()));
            pstmt.setDate(6, new Date(tratamiento.getFechaTermino().getTime()));
            pstmt.setLong(7, tratamiento.getOtroDescuento());
            pstmt.executeUpdate();
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }

    }

    @Override
    public void insertarDescuento(Tratamiento tratamiento, Descuento descuento) throws Exception {
        logger.debug("Insertando descuento:"+descuento+" para el tratamiento: "+tratamiento);
        PreparedStatement pstmt=null;
        String insert="INSERT INTO tratamiento_descuento(trat_id,"
                + "desc_id) "
                + "VALUES(?,?)";
        try {
            pstmt = conexion.preparedStatement(insert);
            pstmt.setInt(1, tratamiento.getId());
            pstmt.setInt(2, descuento.getId());
            pstmt.executeUpdate();
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
    }

    @Override
    public Tratamiento obtenerTratamiento(Tratamiento tratamiento) throws Exception{
        logger.debug("obteniendo tratamiento:"+tratamiento);
        PacienteDao daoPaciente=new PacienteDaoImpl();
        MedicoDao daoMedico=new MedicoDaoImpl();
        TipoTratamientoDao daoTipoTratamiento=new TipoTratamientoDaoImpl();
        Tratamiento retorno=null;
        PreparedStatement pstmt=null;
        ResultSet rs=null;
        String consulta="SELECT TRAT_ID,"
               + "PAC_RUT,"
               + "MED_RUT,"
               + "TT_ID,"
               + "TRAT_VALOR,"
               + "TRAT_FEC_INI,"
               + "TRAT_FEC_FIN,"
               + "TRAT_OTRO_DCTO "
               + "from tratamiento "
               + "where trat_id=?";
       logger.debug("consulta:"+consulta);
        try {
            pstmt = conexion.preparedStatement(consulta);
            pstmt.setInt(1, tratamiento.getId());
            rs=pstmt.executeQuery();
            if(rs.next()){
                retorno=new Tratamiento();
                retorno.setId(rs.getInt("TRAT_ID"));
                Paciente  paciente=new Paciente();
                paciente.setRut(rs.getString("PAC_RUT"));
                retorno.setPaciente(daoPaciente.obtenerPaciente(paciente));
                Medico medico=new Medico();
                medico.setRut(rs.getString("MED_RUT"));                
                retorno.setMedico(daoMedico.obtenerMedico(medico));
                TipoTratamiento tipoTratamiento=new TipoTratamiento();
                tipoTratamiento.setId(rs.getInt("TT_ID"));
                retorno.setTipo(daoTipoTratamiento.obtenerTipoTratamieno(tipoTratamiento));
                retorno.setValorRepartir(rs.getLong("TRAT_VALOR"));
                retorno.setFechaInicio(new Date(rs.getDate("TRAT_FEC_INI").getTime()));
                retorno.setFechaTermino(new Date(rs.getDate("TRAT_FEC_FIN").getTime()));
                retorno.setOtroDescuento(rs.getLong("TRAT_OTRO_DCTO"));
                
            }
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
       return retorno;
    }

    @Override
    public List<Tratamiento> getTratamientos(Medico medico) throws Exception {
        logger.debug("obteniendo tratamiento del medico:"+medico);
        List<Tratamiento> tratamientos=new ArrayList();
        PacienteDao daoPaciente=new PacienteDaoImpl();
        MedicoDao daoMedico=new MedicoDaoImpl();
        TipoTratamientoDao daoTipoTratamiento=new TipoTratamientoDaoImpl();
        Tratamiento tratamiento=null;
        Statement stmt=null;
        ResultSet rs=null;
        String consulta="SELECT t.TRAT_ID,"
               + "t.PAC_RUT,"
               + "t.MED_RUT,"
               + "t.TT_ID,"
               + "t.TRAT_VALOR,"
               + "t.TRAT_FEC_INI,"
               + "t.TRAT_FEC_FIN "
               + "from tratamiento t,"
                + "medico m "
               + "where t.med_rut= m.med_rut "
                + "and (m.med_rut='"+medico.getRut()+"' "
                + "or m.med_nombre like '%"+medico.getNombre()+"%' "
                + "or m.med_appat like '%"+medico.getApellidoPaterno()+"%' "
                + "or m.med_apmat like '%"+medico.getApellidoMaterno()+"%')";
       logger.debug("consulta:"+consulta);
        try {
            stmt = conexion.statement();
            
            rs=stmt.executeQuery(consulta);
            while(rs.next()){
                tratamiento=new Tratamiento();
                tratamiento.setId(rs.getInt("TRAT_ID"));
                Paciente  paciente=new Paciente();
                paciente.setRut(rs.getString("PAC_RUT"));
                tratamiento.setPaciente(daoPaciente.obtenerPaciente(paciente));
                Medico med=new Medico();
                med.setRut(rs.getString("MED_RUT"));                
                tratamiento.setMedico(daoMedico.obtenerMedico(med));
                TipoTratamiento tipoTratamiento=new TipoTratamiento();
                tipoTratamiento.setId(rs.getInt("TT_ID"));
                tratamiento.setTipo(daoTipoTratamiento.obtenerTipoTratamieno(tipoTratamiento));
                tratamiento.setValorRepartir(rs.getLong("TRAT_VALOR"));
                tratamiento.setFechaInicio(new Date(rs.getDate("TRAT_FEC_INI").getTime()));
                tratamiento.setFechaTermino(new Date(rs.getDate("TRAT_FEC_FIN").getTime()));
                tratamientos.add(tratamiento);
                
            }
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
       return tratamientos;
    }

    @Override
    public List<Tratamiento> getTratamientos(Paciente paciente) throws Exception {
        logger.debug("obteniendo tratamientos del paciente:"+paciente);
        List<Tratamiento> tratamientos=new ArrayList();
        PacienteDao daoPaciente=new PacienteDaoImpl();
        MedicoDao daoMedico=new MedicoDaoImpl();
        TipoTratamientoDao daoTipoTratamiento=new TipoTratamientoDaoImpl();
        Tratamiento tratamiento=null;
        Statement stmt=null;
        ResultSet rs=null;
        String consulta="SELECT t.TRAT_ID,"
               + "t.PAC_RUT,"
               + "t.MED_RUT,"
               + "t.TT_ID,"
               + "t.TRAT_VALOR,"
               + "t.TRAT_FEC_INI,"
               + "t.TRAT_FEC_FIN "
               + "from tratamiento t,"
                + "paciente p "
               + "where t.PAC_RUT= p.pac_rut "
                + "and (p.pac_rut='"+paciente.getRut()+"' "
                + "or p.pac_nombre like '%"+paciente.getNombre()+"%' "
                + "or p.pac_appat like '%"+paciente.getApellidoPaterno()+"%' "
                + "or p.pac_apmat like '%"+paciente.getApellidoMaterno()+"%')";
       logger.debug("consulta:"+consulta);
        try {
            stmt = conexion.statement();
            
            rs=stmt.executeQuery(consulta);
            while(rs.next()){
                tratamiento=new Tratamiento();
                tratamiento.setId(rs.getInt("TRAT_ID"));
                Paciente  pac=new Paciente();
                pac.setRut(rs.getString("PAC_RUT"));
                tratamiento.setPaciente(daoPaciente.obtenerPaciente(pac));
                Medico med=new Medico();
                med.setRut(rs.getString("MED_RUT"));                
                tratamiento.setMedico(daoMedico.obtenerMedico(med));
                TipoTratamiento tipoTratamiento=new TipoTratamiento();
                tipoTratamiento.setId(rs.getInt("TT_ID"));
                tratamiento.setTipo(daoTipoTratamiento.obtenerTipoTratamieno(tipoTratamiento));
                tratamiento.setValorRepartir(rs.getLong("TRAT_VALOR"));
                tratamiento.setFechaInicio(new Date(rs.getDate("TRAT_FEC_INI").getTime()));
                tratamiento.setFechaTermino(new Date(rs.getDate("TRAT_FEC_FIN").getTime()));
                tratamientos.add(tratamiento);
                
            }
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
       return tratamientos;
    }

    @Override
    public List<Tratamiento> getTratamientos(Tratamiento tratamiento) throws Exception {
        logger.debug("obteniendo tratamientos del tratamiento:"+tratamiento);
        List<Tratamiento> tratamientos=new ArrayList();
        PacienteDao daoPaciente=new PacienteDaoImpl();
        MedicoDao daoMedico=new MedicoDaoImpl();
        TipoTratamientoDao daoTipoTratamiento=new TipoTratamientoDaoImpl();
        Tratamiento trat=null;
        PreparedStatement pstmt=null;
        ResultSet rs=null;
        String consulta="SELECT t.TRAT_ID,"
               + "t.PAC_RUT,"
               + "t.MED_RUT,"
               + "t.TT_ID,"
               + "t.TRAT_VALOR,"
               + "t.TRAT_FEC_INI,"
               + "t.TRAT_FEC_FIN "
               + "from tratamiento t "
               + "where t.TRAT_FEC_INI BETWEEN ? AND ? "
                + "OR t.TRAT_FEC_FIN BETWEEN ? AND ? ";
       logger.debug("consulta:"+consulta);
        try {
            pstmt = conexion.preparedStatement(consulta);
            pstmt.setDate(1, new Date(tratamiento.getFechaInicio().getTime()));
            pstmt.setDate(2, new Date(tratamiento.getFechaTermino().getTime()));
            pstmt.setDate(3, new Date(tratamiento.getFechaInicio().getTime()));
            pstmt.setDate(4, new Date(tratamiento.getFechaTermino().getTime()));
            rs=pstmt.executeQuery();
            while(rs.next()){
                trat=new Tratamiento();
                trat.setId(rs.getInt("TRAT_ID"));
                Paciente  pac=new Paciente();
                pac.setRut(rs.getString("PAC_RUT"));
                trat.setPaciente(daoPaciente.obtenerPaciente(pac));
                Medico med=new Medico();
                med.setRut(rs.getString("MED_RUT"));                
                trat.setMedico(daoMedico.obtenerMedico(med));
                TipoTratamiento tipoTratamiento=new TipoTratamiento();
                tipoTratamiento.setId(rs.getInt("TT_ID"));
                trat.setTipo(daoTipoTratamiento.obtenerTipoTratamieno(tipoTratamiento));
                trat.setValorRepartir(rs.getLong("TRAT_VALOR"));
                trat.setFechaInicio(new Date(rs.getDate("TRAT_FEC_INI").getTime()));
                trat.setFechaTermino(new Date(rs.getDate("TRAT_FEC_FIN").getTime()));
                tratamientos.add(trat);
                
            }
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
       return tratamientos;
    }
    
    
    
}
